package com.zwh.csv.hutool;

import java.io.*;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.text.csv.*;
import cn.hutool.core.util.CharsetUtil;

/**
 * 参考原文链接：https://kafka.blog.csdn.net/article/details/129667218
 */
public class CsvTest {

    private String csvName;

    private String path= "F:\\cscFile\\";

    private int csvMaxSize=20;
    public static void main(String[] args) {
        String csvName="test.csv";
        //自定义标题别名，作为第一行listName
        String[] listName = new String[4];
        listName[0]="用户名";
        listName[1]="用户昵称";
        listName[2]="性别";
        listName[3]="id";
        //获取String[]类型的数据至result中
        List newResult= new ArrayList<String[]>();
        //将listName添加到result中
        newResult.add(listName);

        CsvTest csvTest = new CsvTest();
        csvTest.writeCsvFile(newResult,csvName);
    }

    /**
     * 获取并组装导出数据
     */
    public void exportUserList() {
        //模拟每次接受消息
        List<User> userList=new ArrayList<>();
        for(int i=1;i<35;i++){
            //模拟数据环节
            User tempA  = new User();
            //模拟每次推两条
            tempA.setId("AID-A:"+Integer.toString(i));
            tempA.setSex("A男");
            tempA.setName("Aname:wanger");
            tempA.setNickname("Anickname:Jay");
            tempA.setAge("A30");
            userList.add(tempA);
            User tempB  = new User();
            tempB.setId("BID-B:"+Integer.toString(i));
            tempB.setSex("B男");
            tempB.setName("Bname:wanger");
            tempB.setNickname("Bnickname:Jay");
            tempB.setAge("B30");
            userList.add(tempB);
        }
        List<String[]> result = new ArrayList<>();
        //自定义标题别名，作为第一行listName
        String[] header = new String[4];
        header[0]="用户名";
        header[1]="用户昵称";
        header[2]="性别";
        header[3]="id";
        result.add(header);
        for(User user : userList){
            String[] listValue = new String[5];
            listValue[0] = user.getId();
            listValue[1] = user.getName();
            listValue[2] = user.getNickname();
            listValue[3] = user.getSex();
            result.add(listValue);
        }
        //将组装好的结果集传入导出csv格式的工具类
        writeCsvFile(result,csvName);
    }

    /**
     * 导出csv格式工具类
     * 创建文件并放置数据  这里放置了表头一行数据
     * @param result 导出数据
     * @param fileName 文件名
     */
    public void writeCsvFile(List<String[]> result,String fileName){
        try {
            File csvFile = new File(fileName);  //构造文件
            //导入HuTool中CSV工具包的CsvWriter类
            //设置导出字符类型, CHARSET_UTF_8
//            CsvWriter writer = CsvUtil.getWriter(csvFile, CharsetUtil.CHARSET_UTF_8);
            CsvWriter writer = CsvUtil.getWriter(csvFile, CharsetUtil.CHARSET_UTF_8);
            writer.write(result);  //通过CsvWriter中的write方法写入数据
            writer.close();   //关闭CsvWriter
            //保存文件
            FileInputStream fileInputStream=new FileInputStream(csvFile);
            this.saveFile(fileInputStream,csvFile.getName());
        }
        catch (Exception e){
            System.out.println(e);
        }
    }

    /**
     * 文件保存 覆盖保存
     * @param inputStream
     * @param fileName
     */
    private void saveFile(InputStream inputStream, String fileName) {
        OutputStream os = null;
        try {
            //保存文件路径
            // 1K的数据缓冲 1024000 1M
            byte[] bs = new byte[1024000];
            // 读取到的数据长度
            int len;
            // 输出的文件流保存到本地文件
            File tempFile = new File(path);
            if (!tempFile.exists()) {
                tempFile.mkdirs();
            }
            os = new FileOutputStream(tempFile.getPath() + File.separator + fileName);
            // 开始读取
            while ((len = inputStream.read(bs)) != -1) {
                os.write(bs, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 完毕，关闭所有链接
            try {
                os.close();
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }



    /* *
     * 检查文件是否存在
     * 读取数据封装到实体 读取行数
     */
    private int readSize(String fileName) {
        CsvReader reader = CsvUtil.getReader();
        //从文件中读取CSV数据
        int size = 0;
        try {
            CsvData data = reader.read(FileUtil.file(fileName), CharsetUtil.CHARSET_GBK);
            size = data.getRowCount();
        }catch (Exception e){
            System.out.println("尚未生成："+fileName+ " --即将创建 ");
        }
        return size;

    }

    /* *
     * 读取数据封装到实体
     */
    private  List<CsvRow> readData(String fileName) {
        CsvReader reader = CsvUtil.getReader();
        List<CsvRow> scvData = new ArrayList<>();

        try {
            CsvData data = reader.read(FileUtil.file(fileName), CharsetUtil.CHARSET_GBK);
            scvData = data.getRows();

        }catch (Exception e){
//            System.out.println("尚未生成："+fileName+ " --即将创建 ");
        }

        return scvData;
    }



    public static String getRandomFileName(String pre) {
        SimpleDateFormat simpleDateFormat;

        simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");

        Date date = new Date();

        String str = simpleDateFormat.format(date);

        Random random = new Random();

        int rannum = (int) (random.nextDouble() * (99999 - 10000 + 1)) + 10000;// 获取5位随机数

        return  pre+ str + rannum;// 当前时间

    }


}



